public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = new int[]{0,2};
        s.sortColors(nums);
        for(int e: nums) {
            System.out.print(e + " ");
        }
    }

    public void sortColors(int[] nums) {
        /**
         * 颜色划分
         * 总结：
         *  本题我错了很多次，因此总结之前失误的主要原因
         *      1，采用的三指针，但是我并未对每个指针的定义进行严格规定，存在凭感觉写代码的嫌疑
         *      2，由1就导致区间不明确，衍生出了很多越界问题，并且此时不自知
         *   对于这种题，我们一定要严格规定辅助指针、值的定义，否则将会给解题带来更大的问题*/
        // 1 预处理
        int n = nums.length;

        // 2 三指针
        int i = 0;
        int left = -1;
        int right = n;
        while(i < right) {
            if(nums[i] == 0) {
                swap(nums, ++left, i);
            } else {
                // -由于往后交换的都是未知数，故需要循环扫描
                // -在循环时需要保证i在有效范围内
                while(i < right && nums[i] == 2) {
                    swap(nums, --right, i);
                }
                if(nums[i] == 0) {
                    swap(nums, ++left, i);
                }
            }
            i ++;
        }
    }

    public static void swap(int[] nums, int a, int b) {
        /**
         * 交换a、b下标所在元素*/
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}
